#ifndef APPLICATIONCONFIG_H_
#define APPLICATIONCONFIG_H_

#include <string>
#include "util/HashMap.h"
#include "util/exceptions/ElementNotFoundException.h"
#include "parser/exceptions/InvalidDataException.h"

namespace app {

/*
 * Clase que contiene la configuracion levantada del archivo principal de
 * configuracion y permite recuperar los valores obtenidos.
 */
class ApplicationConfig {
public:
	/*
	 * Metodo para cargar la configuracion desde un archivo de texto. El formato
	 * del mismo debe ser "clave; valor".
	 */
	static bool loadConfigFromFile(std::string fileName);

	/*
	 * Metodo para recuperar las propiedades.
	 */
	static std::string getProperty(std::string id)
			throw (util::ElementNotFoundException);

	/*
	 * Metodo para recuperar propiedades numericas.
	 */
	static int getIntProperty(std::string id)
			throw (util::ElementNotFoundException,
			parser::InvalidDataException);

	/*
	 * Metodo para recuperar una prodiedad booleana. En caso de no existir la
	 * propiedad devuelve false.
	 */
	static bool getBooleanProperty(std::string id);

	/*
	 * Metodo para recuperar propiedades. Devuelve el valor por defecto en caso
	 * de no encontrarla.
	 */
	static std::string getOptionalProperty(std::string id,
			std::string defaultValue);

	/*
	 * Metodo para recuperar propiedades numericas. Devuelve el valor por
	 * defecto en caso de no encontrarla.
	 */
	static int getOptionalIntProperty(std::string id, int defaultValue);

private:
	ApplicationConfig();
	virtual ~ApplicationConfig();
	static util::HashMap<std::string, std::string> propertyList;
};
}

#endif /* APPLICATIONCONFIG_H_ */
